const fs = require('fs').promises;
const { minify } = require('terser');
const path = require('path');

async function build() {
    try {
        // 删除旧的 dist 文件夹(如果存在)
        try {
            await fs.rm(path.join(__dirname, 'dist'), { recursive: true, force: true });
        } catch (err) {
            // 如果文件夹不存在,忽略错误
        }

        // 创建新的 dist 文件夹
        await fs.mkdir(path.join(__dirname, 'dist'));

        // 复制必要的文件到 dist 目录
        const filesToCopy = [
            'README.md',
            'LICENSE'
        ];

        for (const file of filesToCopy) {
            try {
                await fs.copyFile(
                    path.join(__dirname, file),
                    path.join(__dirname, 'dist', file)
                );
            } catch (err) {
                console.warn(`警告: 无法复制 ${file}，可能文件不存在`);
            }
        }

        // 复制 types 目录
        try {
            await fs.mkdir(path.join(__dirname, 'dist', 'types'), { recursive: true });
            await fs.copyFile(
                path.join(__dirname, 'types', 'json-db.d.ts'),
                path.join(__dirname, 'dist', 'types', 'json-db.d.ts')
            );
        } catch (err) {
            console.warn('警告: 无法复制类型定义文件');
        }

        // 读取源文件
        const source = await fs.readFile(path.join(__dirname, 'json-db.js'), 'utf8');
        
        // 压缩配置
        const options = {
            compress: {
                dead_code: true,
                drop_console: false,  // 保留 console 语句
                drop_debugger: true,
                passes: 2,
                // 添加更多压缩选项
                unsafe: true,        // 启用所有不安全优化
                unsafe_math: true,   // 优化数学表达式
                pure_getters: true,  // 假设对象属性的获取没有副作用
                sequences: true,     // 合并连续的简单语句
                conditionals: true,  // 优化 if 语句和条件表达式
                booleans: true,     // 优化布尔运算
                unused: true,       // 删除未使用的变量和函数
                if_return: true,    // 优化 if/return 和 if/continue 语句
                join_vars: true,    // 合并连续的 var 语句
                collapse_vars: true // 内联单次使用的变量
            },
            mangle: {
                toplevel: true,     // 修改顶级变量名
                keep_classnames: true,  // 保持类名
                keep_fnames: true,      // 保持函数名
                reserved: ['CsDB']      // 保留类名不被混淆
            },
            format: {
                comments: false,    // 删除所有注释，只保留 banner
                beautify: false     // 不美化输出
            },
            sourceMap: false        // 不生成 source map
        };

        // 压缩代码
        const result = await minify(source, options);

        // 生成版本信息
        const version = require('./package.json').version;
        const banner = `/**
 * CsDB - 轻量级JSON数据库工具
 * 版本: v${version}
 * 作者: 夜幕 <csheng520@qq.com>
 * 许可证: MIT License
 * 项目地址: https://gitee.com/csheng520/csdb
 * 构建时间: ${new Date().toLocaleString()}
 */
`;

        // 写入压缩后的文件
        await fs.writeFile(
            path.join(__dirname, 'dist', 'json-db.min.js'),
            banner + result.code
        );

        // 创建 dist 目录下的 package.json
        const pkg = require('./package.json');
        const distPkg = {
            name: pkg.name,
            version: pkg.version,
            description: pkg.description,
            main: 'json-db.min.js',
            module: 'json-db.min.js',
            types: 'types/json-db.d.ts',  // 确保这个字段存在
            author: pkg.author,
            license: pkg.license,
            keywords: pkg.keywords,
            repository: pkg.repository,
            bugs: pkg.bugs,
            homepage: pkg.homepage,
            files: [
                'json-db.min.js',
                'types',  // 确保包含 types 目录
                'README.md',
                'LICENSE'
            ]
        };

        await fs.writeFile(
            path.join(__dirname, 'dist', 'package.json'),
            JSON.stringify(distPkg, null, 2)
        );

        console.log('构建成功：dist/json-db.min.js');
        console.log('npm 包文件已准备就绪');
    } catch (error) {
        console.error('构建失败：', error);
    }
}

build();